Skip to content

fix(google_genai): guard against None content.parts in _extract_response_text#5857

Closed
NIK-TIGER-BILL wants to merge 1 commit intogetsentry:masterfrom
NIK-TIGER-BILL:fix/google-genai-none-parts
Closed

fix(google_genai): guard against None content.parts in _extract_response_text#5857
NIK-TIGER-BILL wants to merge 1 commit intogetsentry:masterfrom
NIK-TIGER-BILL:fix/google-genai-none-parts

Conversation

@NIK-TIGER-BILL
Copy link
Copy Markdown

Description

When a Gemini API candidate's content.parts attribute is present but set to None (e.g. an interrupted generation or a model turn with no text), the existing hasattr(candidate.content, "parts") guard passed but the subsequent for part in candidate.content.parts loop raised:

TypeError: 'NoneType' object is not iterable

The fix replaces the hasattr sentinel with getattr(..., None), which evaluates falsy for both absent and None-valued attributes, matching the pattern used elsewhere in the file (e.g. line 220).

Changed files:

  • sentry_sdk/integrations/google_genai/utils.py — one-line guard fix
  • tests/integrations/google_genai/test_google_genai.py — regression test

Issues

Reminders

  • Tests added (test_response_with_none_content_parts)
  • Lint: no new code style issues introduced
  • PR title uses conventional commit style

…nse_text

When a Gemini candidate's content.parts attribute exists but is set to
None (e.g. interrupted generation or model returning an empty turn),
the previous hasattr() check passed but iterating over None raised:

    TypeError: 'NoneType' object is not iterable

Replace the hasattr sentinel with getattr(..., None) which evaluates
falsy for both absent and None-valued attributes.

Fixes getsentry#5854

Signed-off-by: NIK-TIGER-BILL <nik.tiger.bill@github.com>
@NIK-TIGER-BILL NIK-TIGER-BILL requested a review from a team as a code owner March 25, 2026 07:04
@stephanie-anderson stephanie-anderson added the violating-contribution-guidelines Used for automated community contribution checks. label Mar 25, 2026
@stephanie-anderson
Copy link
Copy Markdown
Contributor

This PR has been closed. The referenced issue does not show a discussion between you and a maintainer.

To avoid wasted effort on both sides, please discuss your proposed approach in the issue first and wait for a maintainer to respond before opening a PR.

Please review our contributing guidelines for more details.

@stephanie-anderson stephanie-anderson added the missing-maintainer-discussion Used for automated community contribution checks. label Mar 27, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟢 Patch (bug fixes)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

Anthropic

  • Record finish reasons in AI monitoring spans by ericapisani in #5678
  • Emit gen_ai.chat spans for asynchronous messages.stream() by alexander-alderman-webb in #5572
  • Emit AI Client Spans for synchronous messages.stream() by alexander-alderman-webb in #5565
  • Set gen_ai.response.id span attribute by ericapisani in #5662
  • Add gen_ai.system attribute to spans by ericapisani in #5661

Langchain

  • Set gen_ai.operation.name and gen_ai.pipeline.name on LLM spans by ericapisani in #5849
  • Broaden AI provider detection beyond OpenAI and Anthropic by ericapisani in #5707
  • Update LLM span operation to gen_ai.generate_text by ericapisani in #5796

Pydantic Ai

  • Support ImageUrl content type in span instrumentation by ericapisani in #5629
  • Add tool description to execute_tool spans by ericapisani in #5596

Other

  • (asgi) Add option to disable suppressing chained exceptions by alexander-alderman-webb in #5714
  • (crons) Add owner field to MonitorConfig by julwhitney13 in #5610
  • (logging) Separate ignore lists for events/breadcrumbs and sentry logs by sl0thentr0py in #5698
  • (otlp) Add collector_url option to OTLPIntegration by sl0thentr0py in #5603

Bug Fixes 🐛

Anthropic

  • Set exception info on streaming span when applicable by alexander-alderman-webb in #5683
  • Patch AsyncStream.close() and AsyncMessageStream.close() to finish spans by alexander-alderman-webb in #5675
  • Patch Stream.close() and MessageStream.close() to finish spans by alexander-alderman-webb in #5674
  • Close span on GeneratorExit by alexander-alderman-webb in #5643

Ci

  • Use gh CLI to convert PR to draft by stephanie-anderson in #5874
  • Use GitHub App token for draft PR enforcement by stephanie-anderson in #5871

Google Genai

  • Guard against None content.parts in _extract_response_text by NIK-TIGER-BILL in #5857
  • Guard response extraction by alexander-alderman-webb in #5869

Openai

  • Always set gen_ai.response.streaming for Responses by alexander-alderman-webb in #5697
  • Simplify Responses input handling by alexander-alderman-webb in #5695
  • Use max_output_tokens for Responses API by alexander-alderman-webb in #5693
  • Always set gen_ai.response.streaming for Completions by alexander-alderman-webb in #5692
  • Simplify Completions input handling by alexander-alderman-webb in #5690
  • Simplify embeddings input handling by alexander-alderman-webb in #5688

Other

  • (ai) Truncate list-based message content in AI monitoring by ericapisani in #5631
  • (celery) Propagate user-set headers by sentrivana in #5581
  • (langchain) Wrap finish_reason in array for gen_ai span attribute by ericapisani in #5666
  • (logging) Fix deadlock in log batcher by sentrivana in #5684
  • (profiler) Prevent buffer race condition during rapid start/stop cycles by ericapisani in #5622
  • (starlette) Catch Jinja2Templates ImportError by alexander-alderman-webb in #5741
  • (utils) Avoid double serialization of strings in safe_serialize by ericapisani in #5587
  • (workflow) Fix permission issue with github app and PR draft graphql endpoint by Jeffreyhung in #5887
  • Enable unused import ruff check and fix unused imports by sentrivana in #5652

Documentation 📚

  • (openai-agents) Remove inapplicable comment by alexander-alderman-webb in #5495
  • Update CONTRIBUTING.md with contribution requirements and TOC by stephanie-anderson in #5896
  • Add note on AI PRs to CONTRIBUTING.md by sentrivana in #5696
  • Add AGENTS.md by sentrivana in #5579
  • Add set_attribute example to changelog by sentrivana in #5578

Internal Changes 🔧

Anthropic

  • Check system and response ID attributes on spans created by stream() by alexander-alderman-webb in #5665
  • Skip accumulation logic for unexpected types in streamed response by alexander-alderman-webb in #5564
  • Factor out streamed result handling by alexander-alderman-webb in #5563
  • Stream valid JSON by alexander-alderman-webb in #5641
  • Stop mocking response iterator by alexander-alderman-webb in #5573

Docs

  • Remove agentic codebase documentation workflows by dingsdax in #5655
  • Switch agentic workflows from Copilot to Claude engine by dingsdax in #5654
  • Add agentic workflows for codebase documentation by dingsdax in #5649

Langchain

  • Add text completion test by alexander-alderman-webb in #5740
  • Add tool execution test by alexander-alderman-webb in #5739
  • Add basic agent test with Responses call by alexander-alderman-webb in #5726
  • Replace mocks with httpx types by alexander-alderman-webb in #5724
  • Consolidate span origin assertion by alexander-alderman-webb in #5723
  • Consolidate available tools assertion by alexander-alderman-webb in #5721

Openai

  • Replace mocks with httpx types for streaming Responses by alexander-alderman-webb in #5882
  • Replace mocks with httpx types for streaming Completions by alexander-alderman-webb in #5879
  • Move input handling code into API-specific functions by alexander-alderman-webb in #5687

Openai Agents

  • Do not fail on new tool fields by alexander-alderman-webb in #5625
  • Stop expecting a specific function name by alexander-alderman-webb in #5623
  • Set streaming header when library uses with_streaming_response() by alexander-alderman-webb in #5583
  • Replace mocks with httpx for streamed responses by alexander-alderman-webb in #5580
  • Replace mocks with httpx in non-MCP tool tests by alexander-alderman-webb in #5602
  • Replace mocks with httpx in MCP tool tests by alexander-alderman-webb in #5605
  • Replace mocks with httpx in handoff tests by alexander-alderman-webb in #5604
  • Replace mocks with httpx in API error test by alexander-alderman-webb in #5601
  • Replace mocks with httpx in non-error single-response tests by alexander-alderman-webb in #5600
  • Remove test for unreachable state by alexander-alderman-webb in #5584
  • Expect namespace tool field for new openai versions by alexander-alderman-webb in #5599

Other

  • (ai) Rename generate_text to text_completion by ericapisani in #5885
  • (asyncpg) Normalize query whitespace in integration by ericapisani in #5855
  • (graphene) Simplify span creation by sentrivana in #5648
  • (httpx) Resolve type checking failures by alexander-alderman-webb in #5626
  • (pyramid) Support alpha suffixes in version parsing by alexander-alderman-webb in #5618
  • (rust) Don't implement separate scope management by sentrivana in #5639
  • (strawberry) Simplify span creation by sentrivana in #5647
  • Add workflow to close unvetted non-maintainer PRs by stephanie-anderson in #5895
  • Exclude compromised litellm versions by alexander-alderman-webb in #5876
  • Reactivate litellm tests by alexander-alderman-webb in #5853
  • Add note to coordinate with assignee before PR submission by sentrivana in #5868
  • Temporarily stop running litellm tests by alexander-alderman-webb in #5851
  • Pin GitHub Actions to full-length commit SHAs by joshuarli in #5781
  • Add -latest alias for each integration test suite by sentrivana in #5706
  • Use date-based branch names for toxgen PRs by sentrivana in #5704
  • 🤖 Update test matrix with new releases (03/19) by github-actions in #5703
  • Add client report tests for span streaming by sentrivana in #5677
  • 🤖 Update test matrix with new releases (03/16) by github-actions in #5671
  • Remove custom warden action by sentrivana in #5653
  • Add httpx to linting requirements by alexander-alderman-webb in #5644
  • Remove CodeQL action by sentrivana in #5616
  • Normalize dots in package names in populate_tox.py by alexander-alderman-webb in #5574
  • Do not run actions on potel-base by sentrivana in #5614

Other

  • ci+docs: Add draft PR enforcement by stephanie-anderson in #5867
  • release: 2.56.0 by alexander-alderman-webb in f5e93ad0
  • Update CHANGELOG.md by sentrivana in #5685
  • release: 2.55.0 by sentrivana in 038a4290

🤖 This preview updates automatically when you update the PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

missing-maintainer-discussion Used for automated community contribution checks. violating-contribution-guidelines Used for automated community contribution checks.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

TypeError: 'NoneType' object is not iterable in google_genai integration

2 participants